package vip.liux.contracts.models.point;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import vip.liux.contracts.shared.enums.point.TransactionStatus;
import vip.liux.domain.entities.auditing.CreationAuditedEntity;

import java.math.BigDecimal;

/**
 * 积分交易实体类
 * 表示用户积分账户的交易记录，包括积分变动、交易类型、状态等信息。
 */
@Getter
@Setter
@Entity
@Table(name = "shop_points_transaction", indexes = {
        @Index(name = "idx_user_id", columnList = "user_id"),
        @Index(name = "idx_transaction_no", columnList = "transaction_no"),
        @Index(name = "idx_related_no", columnList = "related_no")
})
public class PointsTransaction extends CreationAuditedEntity<Long> {

    /**
     * 用户ID
     * 表示交易所属的用户，与数据库中的user_id字段映射。
     */
    @Column(name = "user_id", nullable = false)
    private Long userId;

    /**
     * 变动积分
     * 表示本次交易的积分变动数量，正数表示增加，负数表示减少。
     */
    @Column(nullable = false)
    private BigDecimal points;

    /**
     * 规则编码
     * 表示积分规则的唯一编码。
     */
    @Column(name = "rule_code", nullable = false, length = 64)
    private String ruleCode;

    /**
     * 交易流水号
     * 表示本次交易的唯一标识符。
     */
    @Column(name = "transaction_no", nullable = false, length = 64)
    private String transactionNo;

    /**
     * 关联业务单号
     * 表示与本次交易相关的业务单号，例如订单号。
     */
    @Column(name = "related_no", length = 64)
    private String relatedNo;

    /**
     * 交易状态 0-已完成 1-已退款
     */
    @Column(name = "status", nullable = false)
    @Enumerated(EnumType.ORDINAL)
    private TransactionStatus status;

    /**
     * 交易描述
     * 表示本次交易的详细描述信息。
     */
    @Column(name = "description", length = 255)
    private String description;

    /**
     * 交易失败原因
     */
    @Column(name = "failed_reason")
    private String failedReason;
}